local map = vim.api.nvim_set_keymap
-- 复用 opt 参数
local opt = { noremap = true, silent = true }

-- 映射n v o 模式
map("", "gl", "$", opt)
map("", "gh", "^", opt)
-- leap.nvim 往前跳转
-- map("", "w", "<Plug>(leap-backward)", {})

map("n", "x", "<Nop>", opt) -- 禁用 x 键映射

map("n", "m", "<c-w>w", opt)
map("n", "<leader><space>", ":noh<CR>", opt)
map("n", "<leader>re", ":luafile $MYVIMRC<CR>", opt)
map("n", "<leader><leader>", "<C-w>o<C-w>v", opt)
map("n", "<c-s>", ":wa!<CR>", opt)
map("n", "m", "<c-w>w", opt)
map("v", "<c-v>", '"+p', opt)
map("i", "<c-v>", "<c-r>+", opt)
map("v", "<c-c>", '<Plug>OSCyank', opt)

map("n", "<space>,", ":Telescope find_files<CR>", opt)
map("n", "<space><leader>", ":TranslateW<CR>", opt)
map("n", "<c-f>", ":Telescope live_grep<CR>", opt)
map("n", "gj", ":pu<CR>", opt)
map("n", "gk", "k:pu<CR>", opt)
map("n", "gp", "gP", opt)
map("n", "<CR>", "gd", opt)
map("n", "<space>m", ":MarkdownPreview<CR>", opt)

map("i", "<c-n>", "<Down>", opt)
map("i", "<c-p>", "<Up>", opt)
map("i", "<c-f>", "<Right>", opt)
map("i", "<c-b>", "<Left>", opt)
map("i", "<c-a>", "<Home>", opt)
map("i", "<c-e>", "<End>", opt)

map("c", "<c-f>", "<Right>", opt)
map("c", "<c-b>", "<Left>", opt)
map("c", "<c-a>", "<Home>", opt)
map("c", "<c-e>", "<End>", opt)

-- nvim 插件快捷键
map("n", "<space>ff", ":NvimTreeToggle<CR>", opt)

-- bufferline 插件快捷键
map("n", "xl", ":BufferLineCycleNext<CR>", opt)
map("n", "xh", ":BufferLineCyclePrev<CR>", opt)
map("n", "xo", ":%bd|e#|bd#<CR>", opt)
map("n", "xx", ":Bdelete<CR>", opt)

-- 插件快捷键
local pluginKeys = {}

-- nvim tree 插件快捷键
pluginKeys.nvimTreeList = {
  -- 打开文件或文件夹
  { key = { "<CR>", "o", "<2-LeftMouse>" }, action = "edit" },
  -- 分屏打开文件
  { key = "v", action = "vsplit" },
  { key = "h", action = "split" },
  -- 显示隐藏文件key
  { key = "i", action = "toggle_custom" }, -- 对应 filters 中的 custom (node_modules)
  { key = ".", action = "toggle_dotfiles" }, -- Hide (dotfiles)
  -- 文件操作
  { key = "<F5>", action = "refresh" },
  { key = "a", action = "create" },
  { key = "d", action = "remove" },
  { key = "r", action = "rename" },
  { key = "x", action = "cut" },
  { key = "m", action = "" }, -- 取消映射 m
  { key = "c", action = "copy" },
  { key = "yy", action = "copy" },
  { key = "p", action = "paste" },
  { key = "s", action = "" }, -- 取消映射s
}
-- lsp 插件快捷键

pluginKeys.mapLSP = function(mapbuf)
  -- rename
  mapbuf("n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opt)
  -- code action
  mapbuf("n", "<space>.", "<cmd>lua vim.lsp.buf.code_action()<CR>", opt)
  -- go xx
  mapbuf("n", "<CR>", "<cmd>lua vim.lsp.buf.definition()<CR>", opt)
  mapbuf("n", "ge", "<cmd>lua vim.lsp.buf.hover()<CR>", opt)
  mapbuf("n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opt)
  mapbuf("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opt)
  -- mapbuf("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opt)
  -- diagnostic
  -- mapbuf("n", "gp", "<cmd>lua vim.diagnostic.open_float()<CR>", opt)
  --  mapbuf("n", "gk", "<cmd>lua vim.diagnostic.goto_prev()<CR>", opt)
  -- mapbuf("n", "gj", "<cmd>lua vim.diagnostic.goto_next()<CR>", opt)
  mapbuf("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opt)
  -- 没用到
  -- mapbuf('n', '<leader>q', '<cmd>lua vim.diagnostic.setloclist()<CR>', opt)
  -- mapbuf("n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opt)
  -- mapbuf('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opt)
  -- mapbuf('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opt)
  -- mapbuf('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opt)
  -- mapbuf('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opt)
end

-- Telescope 列表中 插入模式快捷键
pluginKeys.telescopeList = {
  i = {
    -- 上下移动
    ["<C-n>"] = "move_selection_next",
    ["<C-p>"] = "move_selection_previous",
    ["<Down>"] = "move_selection_next",
    ["<Up>"] = "move_selection_previous",
    -- 历史记录
    ["<C-j>"] = "cycle_history_next",
    ["<C-k>"] = "cycle_history_prev",
    -- 关闭窗口
    ["<C-c>"] = "close",
    -- 预览窗口上下滚动
    ["<C-u>"] = "preview_scrolling_up",
    ["<C-d>"] = "preview_scrolling_down",
  },
}

-- nvim-cmp 自动补全
pluginKeys.cmp = function(cmp)
  return {
    -- 出现补全
    ["<A-.>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
    -- 取消
    ["<A-,>"] = cmp.mapping({
      i = cmp.mapping.abort(),
      c = cmp.mapping.close(),
    }),
    -- 上一个
    ["<C-p>"] = cmp.mapping.select_prev_item(),
    -- 下一个
    ["<C-n>"] = cmp.mapping.select_next_item(),
    -- 确认
    ["<CR>"] = cmp.mapping.confirm({
      select = true,
      behavior = cmp.ConfirmBehavior.Replace,
    }),
    -- 如果窗口内容太多，可以滚动
    ["<C-u>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
    ["<C-d>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
  }
end

-- typescript 快捷键
pluginKeys.mapTsLSP = function(mapbuf)
  mapbuf("n", "gs", ":TSLspOrganize<CR>", opt)
  -- mapbuf("n", "gr", ":TSLspRenameFile<CR>", opt)
  mapbuf("n", "gi", ":TSLspImportAll<CR>", opt)
end

return pluginKeys
